package Spielfeld;

import java.awt.Color;
import java.awt.Graphics;
import java.util.LinkedList;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class SpielfeldGui extends JPanel
{
	private static final long serialVersionUID = 1L;
	Graphics g;
	public static final int GROESSE_PRO_FELD = 20;
	private JFrame hauptFrame;
	List<Spielfeld> felder;
	
	public SpielfeldGui ()
	{
		felder = new LinkedList<Spielfeld>();
		
		hauptFrame = new JFrame("Schiffe versenken");
		
		hauptFrame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
		hauptFrame.setSize (800, 600);
		hauptFrame.setLocationRelativeTo (null);
		hauptFrame.setVisible (true);
		hauptFrame.add (this);
	}
	
	public void neuesSpielfeld (Spielfeld feld)
	{
		felder.add(feld);
	}
	
	public void loescheAlleSpielfelder ()
	{
		felder.removeAll(felder);
	}
	
	public void paintComponent (Graphics g)
	{
		this.g = g;
		
		super.paintComponents(g);
		
		for (Spielfeld f : felder)
		{
			zeichneFeld (g, f);
		}
	}
	
	private void zeichneFeld (Graphics g, Spielfeld feld)
	{
		//Zeichne Gitter
		g.setColor(new Color (0.0f, 0.0f, 0.0f));
		for (int i = 0; i <= feld.getFeldGroesse(); i++)
		{
			g.drawLine(feld.getX() + (i * GROESSE_PRO_FELD + i), feld.getY(), feld.getX() + (i * GROESSE_PRO_FELD + i),
					feld.getY() + (feld.getFeldGroesse() * GROESSE_PRO_FELD + feld.getFeldGroesse()));
			
			g.drawLine(feld.getX(), feld.getY() + (i * GROESSE_PRO_FELD + i), feld.getX() + (feld.getFeldGroesse() * GROESSE_PRO_FELD + feld.getFeldGroesse()),
					feld.getY() + (i * GROESSE_PRO_FELD + i));
		}
		
		//Zeichne Felder
		for (int x = 0; x < feld.getFeldGroesse(); x++)
		{
			for (int y = 0; y < feld.getFeldGroesse(); y++)
			{
				if (feld.getVersteckt())
				{
					int status = feld.getFeldStatus(x, y);
					
					switch (status)
					{
					case Spielfeld.STATUS_LEER:
						g.setColor(new Color (1.0f, 1.0f, 1.0f));
						g.fillRect(feld.getX() + (1 + x * GROESSE_PRO_FELD + x), feld.getY() + (1 + y * GROESSE_PRO_FELD + y), GROESSE_PRO_FELD, GROESSE_PRO_FELD);
						break;
						
					case Spielfeld.STATUS_SCHIFF:
						g.setColor(new Color (1.0f, 1.0f, 1.0f));
						g.fillRect(feld.getX() + (1 + x * GROESSE_PRO_FELD + x), feld.getY() + (1 + y * GROESSE_PRO_FELD + y), GROESSE_PRO_FELD, GROESSE_PRO_FELD);
						break;
						
					case Spielfeld.STATUS_LEER_GETROFFEN:
						g.setColor(new Color (1.0f, 1.0f, 1.0f));
						g.fillRect(feld.getX() + (1 + x * GROESSE_PRO_FELD + x), feld.getY() + (1 + y * GROESSE_PRO_FELD + y), GROESSE_PRO_FELD, GROESSE_PRO_FELD);
						g.setColor(new Color (0.0f, 0.0f, 0.0f));
						g.drawLine(feld.getX() + (1 + x * GROESSE_PRO_FELD + x), feld.getY() + (1 + y * GROESSE_PRO_FELD + y),
								   feld.getX() + (1 + x * GROESSE_PRO_FELD + x) + GROESSE_PRO_FELD, feld.getY() + (1 + y * GROESSE_PRO_FELD + y) + GROESSE_PRO_FELD);
						g.drawLine(feld.getX() + (1 + x * GROESSE_PRO_FELD + x), feld.getY() + (1 + y * GROESSE_PRO_FELD + y) + GROESSE_PRO_FELD,
								   feld.getX() + (1 + x * GROESSE_PRO_FELD + x) + GROESSE_PRO_FELD, feld.getY() + (1 + y * GROESSE_PRO_FELD + y));
						break;
						
					case Spielfeld.STATUS_SCHIFF_GETROFFEN:
						g.setColor(new Color (0.0f, 0.0f, 0.0f));
						g.fillRect(feld.getX() + (1 + x * GROESSE_PRO_FELD + x), feld.getY() + (1 + y * GROESSE_PRO_FELD + y), GROESSE_PRO_FELD, GROESSE_PRO_FELD);
						g.setColor(new Color (1.0f, 0.0f, 0.0f));
						g.drawLine(feld.getX() + (1 + x * GROESSE_PRO_FELD + x), feld.getY() + (1 + y * GROESSE_PRO_FELD + y),
								   feld.getX() + (1 + x * GROESSE_PRO_FELD + x) + GROESSE_PRO_FELD, feld.getY() + (1 + y * GROESSE_PRO_FELD + y) + GROESSE_PRO_FELD);
						g.drawLine(feld.getX() + (1 + x * GROESSE_PRO_FELD + x), feld.getY() + (1 + y * GROESSE_PRO_FELD + y) + GROESSE_PRO_FELD,
							       feld.getX() + (1 + x * GROESSE_PRO_FELD + x) + GROESSE_PRO_FELD, feld.getY() + (1 + y * GROESSE_PRO_FELD + y));
						break;
					}
				}
				else
				{
					int status = feld.getFeldStatus(x, y);
				
					switch (status)
					{
					case Spielfeld.STATUS_LEER:
						g.setColor(new Color (1.0f, 1.0f, 1.0f));
						g.fillRect(feld.getX() + (1 + x * GROESSE_PRO_FELD + x), feld.getY() + (1 + y * GROESSE_PRO_FELD + y), GROESSE_PRO_FELD, GROESSE_PRO_FELD);
						break;
						
					case Spielfeld.STATUS_SCHIFF:
						g.setColor(new Color (1.0f, 0.0f, 0.0f));
						g.fillRect(feld.getX() + (1 + x * GROESSE_PRO_FELD + x), feld.getY() + (1 + y * GROESSE_PRO_FELD + y), GROESSE_PRO_FELD, GROESSE_PRO_FELD);
						break;
						
					case Spielfeld.STATUS_PHANTOM:
						g.setColor(new Color (0.0f, 1.0f, 0.0f));
						g.fillRect(feld.getX() + (1 + x * GROESSE_PRO_FELD + x), feld.getY() + (1 + y * GROESSE_PRO_FELD + y), GROESSE_PRO_FELD, GROESSE_PRO_FELD);
						break;
						
					case Spielfeld.STATUS_LEER_GETROFFEN:
						g.setColor(new Color (1.0f, 1.0f, 1.0f));
						g.fillRect(feld.getX() + (1 + x * GROESSE_PRO_FELD + x), feld.getY() + (1 + y * GROESSE_PRO_FELD + y), GROESSE_PRO_FELD, GROESSE_PRO_FELD);
						g.setColor(new Color (0.0f, 0.0f, 0.0f));
						g.drawOval(2 + feld.getX() + (1 + x * GROESSE_PRO_FELD + x), 2 + feld.getY() + (1 + y * GROESSE_PRO_FELD + y), GROESSE_PRO_FELD - 4, GROESSE_PRO_FELD - 4);
						break;
						
					case Spielfeld.STATUS_SCHIFF_GETROFFEN:
						g.setColor(new Color (1.0f, 0.1f, 0.1f));
						g.fillRect(feld.getX() + (1 + x * GROESSE_PRO_FELD + x), feld.getY() + (1 + y * GROESSE_PRO_FELD + y), GROESSE_PRO_FELD, GROESSE_PRO_FELD);
						g.setColor(new Color (0.0f, 0.0f, 0.0f));
						g.drawLine(feld.getX() + (1 + x * GROESSE_PRO_FELD + x), feld.getY() + (1 + y * GROESSE_PRO_FELD + y),
								   feld.getX() + (1 + x * GROESSE_PRO_FELD + x) + GROESSE_PRO_FELD, feld.getY() + (1 + y * GROESSE_PRO_FELD + y) + GROESSE_PRO_FELD);
						g.drawLine(feld.getX() + (1 + x * GROESSE_PRO_FELD + x), feld.getY() + (1 + y * GROESSE_PRO_FELD + y) + GROESSE_PRO_FELD,
							       feld.getX() + (1 + x * GROESSE_PRO_FELD + x) + GROESSE_PRO_FELD, feld.getY() + (1 + y * GROESSE_PRO_FELD + y));
						break;
					}
				}
			}
		}
	}
	
	public void zeichne()
	{
		this.repaint();
	}
}
